import Matrix from './Matrix.js'


/*  最小二乘法  算法
      β =  ( X的转置 *X)的逆 * X的转置 * Y
      β 是 系数列向量 的矩阵 即列 为1 的 矩阵  算法就是要返回 β
      X 是  每一行的第一列 是 1  +  变量数据
      Y   是因变量数据的列向量 即列 为1 的 矩阵
*/
export const FactByOLS = function(X,Y){
    let mtrx = new Matrix();
    let T = mtrx.T(X);
    let InTmp =mtrx.Mul(T,X)
    let Inverse = mtrx.InvByLU(InTmp);
    let tmp = mtrx.Mul(Inverse,T);
    return mtrx.Mul(tmp,Y);
};

//获取累加数组
const getAccuSequ=function(data){
    let accuArray =[];
    let d = 0;
    for(let i=0;i<data.length;i++){
        d += data[i];
        accuArray.push(d);
    }
    return accuArray
}

//通过累加数组获取紧邻均值序列  比累加少个
const getCloseAvgSequ=function(accuSequ){
    let closeAvgArray =[];
    let d=0;
    for(let i=1;i<accuSequ.length;i++){
        d = -0.5*(accuSequ[i]+accuSequ[i-1]);
        closeAvgArray.push(d);
    }
    return closeAvgArray
}

//数据矩阵B
const getBMatrix=function(closeAvgSequ){
    let B=[];
    for(let i=0;i<closeAvgSequ.length;i++){
        B.push([closeAvgSequ[i],1]);
    }
    return B;
}

//数据向量Y
const getYMatrix=function(data){
    let Y =[];
    for(let i=1;i<data.length;i++){
        Y.push([data[i]]);
    }
    return Y;
};
 //发展系数a及灰作用量b 得到 [a,b]转置
const getFactAndGrey=function(B,Y){
    //最小二乘法 获取 矩阵
    let m = FactByOLS(B,Y);
    return {a:m[0][0],b:m[1][0]};
}

export const GM =function(data){
    let AGO = getAccuSequ(data);
    let CAS = getCloseAvgSequ(AGO);
    let B = getBMatrix(CAS);
    let Y = getYMatrix(data);
    let factAndGrey = getFactAndGrey(B,Y);
}




